package com.gupao.javavip.gof.singleton;

/**
 * 懒汉式单例模式-线程安全-代码块线程同步
 * <p>
 * 双重检查锁
 * 优点：规避了线程安全问题。阻塞并不是基于整个类的阻塞，而是在 getInstance()方法内部阻塞，只要逻辑不是太复杂，对于调用者而言感知不到。
 * 缺点：用到 synchronized 关键字，总归是要上锁，对程序性能还是存在一定影响的。
 */
public class LazySingletonSafeMethodCode {
    private static LazySingletonSafeMethodCode INSTANCE = null;

    //构造方法私有化
    private LazySingletonSafeMethodCode() {
        if (INSTANCE != null) {
            throw new RuntimeException("不允许创建多个实例");
        }
    }

    //提供全局访问点
    public static LazySingletonSafeMethodCode getInstance() {
        if (INSTANCE == null) {
            //这里一定要在if语句里面加synchronized语句，且必须再次加上是否为空的判断
            synchronized (LazySingletonSafeMethodCode.class) {
                if (INSTANCE == null) {
                    INSTANCE = new LazySingletonSafeMethodCode();
                }
            }
        }
        return INSTANCE;
    }
}
